! include/40/omp_lib.f90.var
! $Revision: 41674 $
! $Date: 2012-06-05 08:33:35 -0500 (Tue, 05 Jun 2012) $

! <copyright>
!    Copyright (c) 1985-2013 Intel Corporation.  All Rights Reserved.
!
!    Redistribution and use in source and binary forms, with or without
!    modification, are permitted provided that the following conditions
!    are met:
!
!      * Redistributions of source code must retain the above copyright
!        notice, this list of conditions and the following disclaimer.
!      * Redistributions in binary form must reproduce the above copyright
!        notice, this list of conditions and the following disclaimer in the
!        documentation and/or other materials provided with the distribution.
!      * Neither the name of Intel Corporation nor the names of its
!        contributors may be used to endorse or promote products derived
!        from this software without specific prior written permission.
!
!    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
!    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
!    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
!    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
!    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
!    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
!    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
!    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
!    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
!    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
!    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
!
! </copyright>

      module omp_lib_kinds

        use, intrinsic :: iso_c_binding

        integer, parameter :: omp_integer_kind       = c_int
        integer, parameter :: omp_logical_kind       = 4
        integer, parameter :: omp_real_kind          = c_float
        integer, parameter :: kmp_double_kind        = c_double
        integer, parameter :: omp_lock_kind          = c_intptr_t
        integer, parameter :: omp_nest_lock_kind     = c_intptr_t
        integer, parameter :: omp_sched_kind         = omp_integer_kind
        integer, parameter :: omp_proc_bind_kind     = omp_integer_kind
        integer, parameter :: kmp_pointer_kind       = c_intptr_t
        integer, parameter :: kmp_size_t_kind        = c_size_t
        integer, parameter :: kmp_affinity_mask_kind = c_intptr_t
        integer, parameter :: kmp_cancel_kind        = omp_integer_kind

      end module omp_lib_kinds

      module omp_lib

        use omp_lib_kinds

        integer (kind=omp_integer_kind), parameter :: openmp_version    = $OMP_VERSION
        integer (kind=omp_integer_kind), parameter :: kmp_version_major = $KMP_VERSION_MAJOR
        integer (kind=omp_integer_kind), parameter :: kmp_version_minor = $KMP_VERSION_MINOR
        integer (kind=omp_integer_kind), parameter :: kmp_version_build = $KMP_VERSION_BUILD
        character(*)               kmp_build_date
        parameter( kmp_build_date = '$KMP_BUILD_DATE' )

        integer(kind=omp_sched_kind), parameter :: omp_sched_static  = 1
        integer(kind=omp_sched_kind), parameter :: omp_sched_dynamic = 2
        integer(kind=omp_sched_kind), parameter :: omp_sched_guided  = 3
        integer(kind=omp_sched_kind), parameter :: omp_sched_auto    = 4


        integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_false = 0
        integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_true = 1
        integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_master = 2
        integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_close = 3
        integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_spread = 4

        integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_parallel = 1
        integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_loop = 2
        integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_sections = 3
        integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_taskgroup = 4

        interface

!         ***
!         *** omp_* entry points
!         ***

          subroutine omp_set_num_threads(nthreads) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind), value :: nthreads
          end subroutine omp_set_num_threads

          subroutine omp_set_dynamic(enable) bind(c)
            use omp_lib_kinds
            logical (kind=omp_logical_kind), value :: enable
          end subroutine omp_set_dynamic

          subroutine omp_set_nested(enable) bind(c)
            use omp_lib_kinds
            logical (kind=omp_logical_kind), value :: enable
          end subroutine omp_set_nested

          function omp_get_num_threads() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_num_threads
          end function omp_get_num_threads

          function omp_get_max_threads() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_max_threads
          end function omp_get_max_threads

          function omp_get_thread_num() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_thread_num
          end function omp_get_thread_num

          function omp_get_num_procs() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_num_procs
          end function omp_get_num_procs

          function omp_in_parallel() bind(c)
            use omp_lib_kinds
            logical (kind=omp_logical_kind) omp_in_parallel
          end function omp_in_parallel

          function omp_get_dynamic() bind(c)
            use omp_lib_kinds
            logical (kind=omp_logical_kind) omp_get_dynamic
          end function omp_get_dynamic

          function omp_get_nested() bind(c)
            use omp_lib_kinds
            logical (kind=omp_logical_kind) omp_get_nested
          end function omp_get_nested

          function omp_get_thread_limit() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_thread_limit
          end function omp_get_thread_limit

          subroutine omp_set_max_active_levels(max_levels) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind), value :: max_levels
          end subroutine omp_set_max_active_levels

          function omp_get_max_active_levels() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_max_active_levels
          end function omp_get_max_active_levels

          function omp_get_level() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_level
          end function omp_get_level

          function omp_get_active_level() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_active_level
          end function omp_get_active_level

          function omp_get_ancestor_thread_num(level) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_ancestor_thread_num
            integer (kind=omp_integer_kind), value :: level
          end function omp_get_ancestor_thread_num

          function omp_get_team_size(level) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_team_size
            integer (kind=omp_integer_kind), value :: level
          end function omp_get_team_size

          subroutine omp_set_schedule(kind, modifier) bind(c)
            use omp_lib_kinds
            integer (kind=omp_sched_kind), value :: kind
            integer (kind=omp_integer_kind), value :: modifier
          end subroutine omp_set_schedule

          subroutine omp_get_schedule(kind, modifier) bind(c)
            use omp_lib_kinds
            integer (kind=omp_sched_kind) kind
            integer (kind=omp_integer_kind) modifier
          end subroutine omp_get_schedule

          function omp_get_proc_bind() bind(c)
            use omp_lib_kinds
            integer (kind=omp_proc_bind_kind) omp_get_proc_bind
          end function omp_get_proc_bind

          function omp_get_wtime() bind(c)
            use omp_lib_kinds
            real (kind=kmp_double_kind) omp_get_wtime
          end function omp_get_wtime

          function omp_get_wtick() bind(c)
            use omp_lib_kinds
            real (kind=kmp_double_kind) omp_get_wtick
          end function omp_get_wtick

          function omp_get_default_device() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_default_device
          end function omp_get_default_device

          subroutine omp_set_default_device(dflt_device) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind), value :: dflt_device
          end subroutine omp_set_default_device

          function omp_get_num_devices() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_num_devices
          end function omp_get_num_devices

          function omp_get_num_teams() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_num_teams
          end function omp_get_num_teams

          function omp_get_team_num() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_team_num
          end function omp_get_team_num

          function omp_get_cancellation() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_get_cancellation
          end function omp_get_cancellation

          subroutine omp_init_lock(lockvar) bind(c)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_init_lock
!DIR$ ENDIF
            use omp_lib_kinds
            integer (kind=omp_lock_kind) lockvar
          end subroutine omp_init_lock

          subroutine omp_destroy_lock(lockvar) bind(c)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_destroy_lock
!DIR$ ENDIF
            use omp_lib_kinds
            integer (kind=omp_lock_kind) lockvar
          end subroutine omp_destroy_lock

          subroutine omp_set_lock(lockvar) bind(c)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_set_lock
!DIR$ ENDIF
            use omp_lib_kinds
            integer (kind=omp_lock_kind) lockvar
          end subroutine omp_set_lock

          subroutine omp_unset_lock(lockvar) bind(c)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_unset_lock
!DIR$ ENDIF
            use omp_lib_kinds
            integer (kind=omp_lock_kind) lockvar
          end subroutine omp_unset_lock

          function omp_test_lock(lockvar) bind(c)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_test_lock
!DIR$ ENDIF
            use omp_lib_kinds
            logical (kind=omp_logical_kind) omp_test_lock
            integer (kind=omp_lock_kind) lockvar
          end function omp_test_lock

          subroutine omp_init_nest_lock(lockvar) bind(c)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_init_nest_lock
!DIR$ ENDIF
            use omp_lib_kinds
            integer (kind=omp_nest_lock_kind) lockvar
          end subroutine omp_init_nest_lock

          subroutine omp_destroy_nest_lock(lockvar) bind(c)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_destroy_nest_lock
!DIR$ ENDIF
            use omp_lib_kinds
            integer (kind=omp_nest_lock_kind) lockvar
          end subroutine omp_destroy_nest_lock

          subroutine omp_set_nest_lock(lockvar) bind(c)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_set_nest_lock
!DIR$ ENDIF
            use omp_lib_kinds
            integer (kind=omp_nest_lock_kind) lockvar
          end subroutine omp_set_nest_lock

          subroutine omp_unset_nest_lock(lockvar) bind(c)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_unset_nest_lock
!DIR$ ENDIF
            use omp_lib_kinds
            integer (kind=omp_nest_lock_kind) lockvar
          end subroutine omp_unset_nest_lock

          function omp_test_nest_lock(lockvar) bind(c)
!DIR$ IF(__INTEL_COMPILER.GE.1400)
!DIR$ attributes known_intrinsic :: omp_test_nest_lock
!DIR$ ENDIF
            use omp_lib_kinds
            integer (kind=omp_integer_kind) omp_test_nest_lock
            integer (kind=omp_nest_lock_kind) lockvar
          end function omp_test_nest_lock

!         ***
!         *** kmp_* entry points
!         ***

          subroutine kmp_set_stacksize(size) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind), value :: size
          end subroutine kmp_set_stacksize

          subroutine kmp_set_stacksize_s(size) bind(c)
            use omp_lib_kinds
            integer (kind=kmp_size_t_kind), value :: size
          end subroutine kmp_set_stacksize_s

          subroutine kmp_set_blocktime(msec) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind), value :: msec
          end subroutine kmp_set_blocktime

          subroutine kmp_set_library_serial() bind(c)
          end subroutine kmp_set_library_serial

          subroutine kmp_set_library_turnaround() bind(c)
          end subroutine kmp_set_library_turnaround

          subroutine kmp_set_library_throughput() bind(c)
          end subroutine kmp_set_library_throughput

          subroutine kmp_set_library(libnum) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind), value :: libnum
          end subroutine kmp_set_library

          subroutine kmp_set_defaults(string) bind(c)
            use, intrinsic :: iso_c_binding
            character (kind=c_char) :: string(*)
          end subroutine kmp_set_defaults

          function kmp_get_stacksize() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) kmp_get_stacksize
          end function kmp_get_stacksize

          function kmp_get_stacksize_s() bind(c)
            use omp_lib_kinds
            integer (kind=kmp_size_t_kind) kmp_get_stacksize_s
          end function kmp_get_stacksize_s

          function kmp_get_blocktime() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) kmp_get_blocktime
          end function kmp_get_blocktime

          function kmp_get_library() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) kmp_get_library
          end function kmp_get_library

          function kmp_set_affinity(mask) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) kmp_set_affinity
            integer (kind=kmp_affinity_mask_kind) mask
          end function kmp_set_affinity

          function kmp_get_affinity(mask) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) kmp_get_affinity
            integer (kind=kmp_affinity_mask_kind) mask
          end function kmp_get_affinity

          function kmp_get_affinity_max_proc() bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) kmp_get_affinity_max_proc
          end function kmp_get_affinity_max_proc

          subroutine kmp_create_affinity_mask(mask) bind(c)
            use omp_lib_kinds
            integer (kind=kmp_affinity_mask_kind) mask
          end subroutine kmp_create_affinity_mask

          subroutine kmp_destroy_affinity_mask(mask) bind(c)
            use omp_lib_kinds
            integer (kind=kmp_affinity_mask_kind) mask
          end subroutine kmp_destroy_affinity_mask

          function kmp_set_affinity_mask_proc(proc, mask) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) kmp_set_affinity_mask_proc
            integer (kind=omp_integer_kind), value :: proc
            integer (kind=kmp_affinity_mask_kind) mask
          end function kmp_set_affinity_mask_proc

          function kmp_unset_affinity_mask_proc(proc, mask) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) kmp_unset_affinity_mask_proc
            integer (kind=omp_integer_kind), value :: proc
            integer (kind=kmp_affinity_mask_kind) mask
          end function kmp_unset_affinity_mask_proc

          function kmp_get_affinity_mask_proc(proc, mask) bind(c)
            use omp_lib_kinds
            integer (kind=omp_integer_kind) kmp_get_affinity_mask_proc
            integer (kind=omp_integer_kind), value :: proc
            integer (kind=kmp_affinity_mask_kind) mask
          end function kmp_get_affinity_mask_proc

          function kmp_malloc(size) bind(c)
            use omp_lib_kinds
            integer (kind=kmp_pointer_kind) kmp_malloc
            integer (kind=kmp_size_t_kind), value :: size
          end function kmp_malloc

          function kmp_calloc(nelem, elsize) bind(c)
            use omp_lib_kinds
            integer (kind=kmp_pointer_kind) kmp_calloc
            integer (kind=kmp_size_t_kind), value :: nelem
            integer (kind=kmp_size_t_kind), value :: elsize
          end function kmp_calloc

          function kmp_realloc(ptr, size) bind(c)
            use omp_lib_kinds
            integer (kind=kmp_pointer_kind) kmp_realloc
            integer (kind=kmp_pointer_kind), value :: ptr
            integer (kind=kmp_size_t_kind), value :: size
          end function kmp_realloc

          subroutine kmp_free(ptr) bind(c)
            use omp_lib_kinds
            integer (kind=kmp_pointer_kind), value :: ptr
          end subroutine kmp_free

          subroutine kmp_set_warnings_on() bind(c)
          end subroutine kmp_set_warnings_on

          subroutine kmp_set_warnings_off() bind(c)
          end subroutine kmp_set_warnings_off

          function kmp_get_cancellation_status(cancelkind) bind(c)
            use omp_lib_kinds
            integer (kind=kmp_cancel_kind), value :: cancelkind
            logical (kind=omp_logical_kind) kmp_get_cancellation_status
          end function kmp_get_cancellation_status

        end interface

      end module omp_lib
